import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//找到字符串所有字母的异位词；
//实例1：
//输入：s="cdaebabacd"，p="abc";  输出：[0,6];
//实例2；
//输入：s="abab" p="ab"; 输出：[0,1,2];
public class NM2 {
    public static List<Integer> fun(String ss,String pp){
        //1，将两个字符串转化成数组进行操作；
        char[] s=ss.toCharArray();//将ss字符串转化成数组进行相关的操作；
        char[] p=pp.toCharArray();//将pp字符串转化成数组进行相关的操作；
        //2.进行定义相关的变量；
        List<Integer> ret=new ArrayList<>();//返回结果的数组变量；
        int m=p.length;
        //3.利用两个哈希这两个数组中的每个字符的个数；
        int[] hash1=new int[26];
        for(char ch:p){
            hash1[ch-'a']++;
        }
        int[] hash2=new int[26];//此哈希表用来进行记录数组中子数组的相关字母的个数；
        //4，开始使用滑动窗口进行执行相关的代码；
        for(int left=0,right=0,count=0;right< s.length;right++){
            //进窗口操作+维护count操作；(进窗口后进行维护count);
            char in=s[right];
            if(++hash2[in-'a']<=hash1[in-'a']){
                count++;
            }
            //判读操作；
            if(right-left+1>m){
                //出窗口操作+维护count操作；(出窗口前进行维护count;);
                char out=s[left++];
                if(hash2[out-'a']--<=hash1[out-'a']){
                    count--;
                }

            }
            //进行判断是否是异位词；
            if(count==m){
                ret.add(left);//添加数组元素为左下标(作为索引);
            }
        }
        return  ret;//进行结果的返回；
    }
    public static void main(String[] args){
        String ss="cbaebabacd";
        String pp="abc";
        List<Integer> ret=fun(ss,pp);
        System.out.println(ret);
    }
}
